通俗说Openvswitch
Openvswitch,顾名思义,Open,开源的,v,virtual,虚拟的,switch交换机。
通俗的讲就是一款开源的软件,可以创建虚拟的交换机。
为啥需要个虚拟的交换机呢?
这还要从一个概念SDN说起,全称Software Defined Network,软件定义网络。
软件定义有啥好处呢?
想象你有一个大的数据中心,里面有很多的网络设备,光交换机就有很多,你希望在交换机上配置一些网络的策略,例如某个口应该属于某个VLAN。
怎么配置呢?登到这台交换机上去,敲几行命令就搞定了。
如果要配置100台交换机呢?头大了吧,难不成登陆100台?
想不想有一个集中的地方,能看到整个网络的拓扑图,统一配置一下,然后一回车,配置的策略就通过管理网络平面下发到100台交换机上。
这样整个网络的拓扑结构就不是硬的了,也即不是通过插线,拔线,登陆盒子配置的,而是变成了软的,也即通过软件统一控制,这个统一控制的地方我们称为SDN Controller控制器,这样的网络拓扑结构,我们称为软件定义的网络。
控制器控制网络设备的协议是啥呢?对于硬件设备来讲,由于利益纠葛,大家谁也不肯完全统一协议,所以各家用各家的。
但是还是有了一个子集的协议OpenFlow,虽然功能不如各家的协议强大,总算达成了部分共识。
OpenFlow的架构如图所示,和SDN的定义是一样的,要求交换机支持OpenFlow的协议。
有些物理的交换机是遵守这个协议的,将物理机连接起来。
也有些虚拟的交换机是遵守这个协议的,可以将虚拟机连接起来。
因为有了虚拟机,虚拟机的创建,删除,迁移比物理机灵活的多,所以很难像物理的交换机一样,用网线将交换机和物理机连接起来,就不怎么变了。虚拟机就不一样了,所以需要虚拟交换机,也即通过软件模拟一个交换机,用软件模拟一根网线,一头插在虚拟机上,一头插在虚拟交换机上,一会儿创建五个虚拟机,要插到一个交换机上,一会儿其中两个虚拟机迁移到了另外的物理机上,则他们两个的网口要从上一台交换机上拔下来,插到新的虚拟交换机上,这样做没有问题,因为都是软件实现的,很灵活。
Openvswitch就是虚拟交换机的一种实现。
在一台Linux机器上安装了Openvswitch之后,就可以用命令行不费吹灰之力创建虚拟交换机了。
ovs-vsctl add-br ubuntu_br
一个虚拟交换机就创建出来了,名字叫ubuntu_br,不信你ifconfig就能看到了。
ip link add first_br type veth peer name first_if
ip link add second_br type veth peer name second_if
ip link add third_br type veth peer name third_if
创建三根虚拟的网线,一头叫first_br,second_br和third_br,对应的另一头叫first_if, second_if和third_if。
ovs-vsctl add-port ubuntu_br first_br
ovs-vsctl add-port ubuntu_br second_br
ovs-vsctl add-port ubuntu_br third_br
将三根网线的一头插到虚拟交换机上,就形成了下面的图
看你不用买硬件,就能创建复杂的网络拓扑图。
例如你想做TCP/IP详解里面如此复杂的图,本来你应该有一个实验室的,但是用Openvswitch和容器,就能够很容易的模拟了。
有了Openvswitch和Docker,终于可以做《TCP/IP详解》的实验了!
Openvswitch是怎么用软件模拟交换机的呢?
如图是Openvswitch的架构图,Openvswitch是通过如此多的组件来模拟交换机的。
例如上面的那个拓扑图,如此的复杂,创建了交换机,添加了很多的网卡,所有这些信息肯定要有一个地方保存,而不能机器重启了就不见了,保存在哪里呢?在图中明眼人一眼就能看到ovsdb这个进程,对啊,人家是数据库,所有的虚拟交换机的创建,网卡的添加等,都给这个进程,然后这个进程保存在一个文件里面,不至于丢了。
ovsdb仅仅起一个数据库的作用,还需要一个进程真的能够起到创建虚拟交换机的作用,这就是vswitchd。这个进程从数据库里面读取你创建的虚拟交换机和添加的网卡,然后真的创建他们,这个进程在,虚拟交换机是工作的,这个进程宕机了,虚拟交换机就不工作了。
vswtichd这个进程还可以接受openflow协议,如前面SDN描述的一样,其实vswtichd是openflow swtich的具体实现。
vswtichd起到交换的作用,那面网络包从哪里来呢?一般都会从内核里面来,因而需要一个内核的模块,能够监听网卡,将包拿进来,交给虚拟交换机处理。因而内核模块为Datapatch,是一个openvswitch.ko加载到内核里面的。
当openvswtich.ko加载到内核里面的时候,会在网卡上注册一个函数,每当有网络包到达网卡的时候,这个函数就会被调用。
这个函数将网络包开始层层拆包,MAC层,IP层,TCP层等,然后查看有没有已经定义好的策略,来处理网络包,例如修改MAC,修改IP,修改TCP端口,从哪个网卡发出去等策略,如果找到了策略,则直接就从网卡发出去了。
这个处理过程非常快,因为全部在内核里面,因而称为fastpath。
然而内核态,大家都知道,没有多少内存,所以内核态能够保持的策略是很少的,往往有新的策略到来,老的策略就丢弃了。
然而在内核态找不到策略,则不代表没有配置过策略,需要到用户态去寻找,也即将包通过netlink,一种内核态和用户态交互的机制,发送给vswitchd,vswitchd有一个线程一直在监听,发现有从内核态发过来的包,就进入了自己的处理流程,称为slow path。
vswtichd里面就包含了所有的策略,这些策略都是controller通过openflow协议下发给他的。vswtichd会根据网络包的信息层层匹配,总能找到一款策略进行处理,如果实在找不到,则一般会有一个默认策略,例如丢弃这个包。
当找到了一个策略匹配之后,为了下一个相同类型的包能够从内核就匹配到,则通过netlink协议,将这个策略下发给内核。
当这个策略下发给内核后,如果内核空间不足,可能会淘汰一部分老的策略,没关系,由于近因效应,接下来的网络包,应该都是能够匹配这个策略的,例如传输一个文件,同类型的网络包会源源不断的到来,所以放在内核里面是划算的。
玩转Openvwitch第二站:Bridge和Controller
玩转Openvswitch第八站:Interface和Tunnel (上)